package demo2;

import demo1.Person;
import org.junit.Test;

import java.util.Random;

/**
 * @description:通过反射创建运行时类的对象测试
 * @author:Mr.Cat
 * @create:2021-11-22 23:02
 **/
public class NewInstanceTest {
    @Test
    public void test1() throws InstantiationException, IllegalAccessException {
        Class clazz = Person.class;
        /*
        newInstance():调用此方法，创建对应的运行时类的对象，调用的空参构造器
        要想此方法正常的创建运行时类的对象，要求：
        1、运行时此类必须提供空参的构造器
        2、空参的构造器的访问权限得够。通常设置为pubic
        在javabean中要求提供一个pubic的空参构造器。原因:
        1、便于通过反射，创建运行时类的对象
        2、便于子类继承此运行时类时，默认调用super（）时，保证父类有此构造器

        */
        Person p1 = (Person) clazz.newInstance();
        System.out.println(p1);
    }
    //体会反射的动态性
    @Test
    public void test2(){
        int num = new Random().nextInt(3);//0,1,2
        String classPath="";
        switch (num){
            case 0:
                classPath="java.util.Date";
                break;
            case 1:
                classPath="java.lang.Object";
                break;
            case 2:
                classPath="demo1\\Person.java";
                break;
        }
        try {
            Object ob =getInstance(classPath);
            System.out.println(ob);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /*
    创建一个指定类的对象
    classPath:指定类的全类名
    * */
    public Object getInstance(String classPath) throws Exception{
        Class clazz = Class.forName(classPath);
        return clazz.newInstance();
    }
}

